package com.boge.activiti;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Activiti7Test10 {

    /**
     * 流程部署操作
     */
    @Test
    public void test1(){
        // 1.获取ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2.完成流程的部署操作 需要通过RepositoryService来完成
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3.完成部署操作
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("flow/gateway2.bpmn20.xml")
                .name("排他网关")
                .deploy(); // 是一个流程部署的行为 可以部署多个流程定义的
        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
    }

    /**
     * 发起一个流程
     */
    @Test
    public void test3(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        // 发起流程 需要通过 runtimeService来实现
        RuntimeService runtimeService = engine.getRuntimeService();
        // 通过流程定义ID来启动流程  返回的是流程实例对象
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceById("gateway2:1:17503");
        System.out.println("processInstance.getId() = " + processInstance.getId());
        System.out.println("processInstance.getDeploymentId() = " + processInstance.getDeploymentId());
        System.out.println("processInstance.getDescription() = " + processInstance.getDescription());
    }

    /**
     * 任务审批
     */
    @Test
    public void test4(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        List<Task> list = taskService.createTaskQuery().taskAssignee("boss").list();
        for (Task task : list) {
            taskService.complete(task.getId());
        }
    }

    /**
     * 待办任务的 拾取 操作
     *    从候选人 --> 处理人
     * 一个任务如果被拾取后。其他的候选人就查询不到改任务信息了
     */
    @Test
    public void test5(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        String group = "销售部"; // 根据当前登录用户查询到的
        List<Task> list = taskService.createTaskQuery()
                .taskCandidateGroup(group) // 根据组来查询
                .list();
        if(list != null && list.size() > 0){
            for (Task task : list) {
                // 张三1 拾取了 这个任务的审批权限 --> 变成了这个任务的审批人
                taskService.claim(task.getId(),"张三1");
            }
        }
    }

    /**
     *  归还：拾取的用户 不审批了。就放弃审批人的操作
     *  其他的候选人可以重新拾取人了
     */
    @Test
    public void test6(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        String group = "销售部"; // 根据当前登录用户查询到的
        List<Task> list = taskService.createTaskQuery()
                .taskAssignee("张三1")
                .list();
        if(list != null && list.size() > 0){
            for (Task task : list) {
                // System.out.println("task.getId() = " + task.getId());
                // 归还操作的本质其实就是设置审批人为空
                taskService.unclaim(task.getId());
            }
        }
    }

    /**
     *  获取用户审批权限的用户没有时间审批了
     *  但是他也可以不用归还而是做任务的交接。把这个任务让另一个人来审批
     */
    @Test
    public void test8(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        String group = "销售部"; // 根据当前登录用户查询到的
        List<Task> list = taskService.createTaskQuery()
                .taskAssignee("张三1")
                .list();
        if(list != null && list.size() > 0){
            for (Task task : list) {
                // System.out.println("task.getId() = " + task.getId());
                // 任务交接
                taskService.setAssignee(task.getId(),"李四1");
            }
        }
    }

    /**
     * 任务审批
     */
    @Test
    public void test7(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        taskService.complete("92505");
    }
}
